package com.atde._04_structural_design_patterns.proxy.dynamic;


import java.lang.reflect.Proxy;

/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._04_structural_design_patterns.proxy.dynamic
 * @Author: Del
 * @CreateTime: 2025-06-24  00:22
 * @Description: 代理模式 --- 动态代理
 * @Version: 1.0
 */
public class ProxyFactory {

    // 被代理对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 给目标对象 生成一个代理对象
    public Object getProxyInstance() {

        /**
         * 说明：
         *   public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
         *   1. ClassLoader loader: 指定当前目标对象使用的类加载器，获取加载器的方法固定
         *   2. Class<?>[] interfaces: 目标对象实现的接口类型，使用泛型方法确认类型
         *   3. InvocationHandler h: 事件处理，执行目标对象的方法时，会触发事件处理器方法，会把当前执行的目标对象方法作为参数传入  当proxy调用目标对象方法时，会自动被拦截，并会调用InvocationHandler中的invoke方法
         */

        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), (proxy, method, args) -> {
            System.out.println("开始代理...");
            Object invoke = method.invoke(target, args);
            System.out.println("结束代理...");
            return invoke;
        });
    }
}
